iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
Software Development

Laravel 隨筆學習札記系列 第 21

Day21 - 在 Laravel 世界中逐步掌握 HTTP Response 的秘密

  • 分享至 

  • xImage
  •  

昨天了解了 Request,今天要來看 Response,對於 Response 最直接的想法就是將伺服器的處理結果傳遞回客戶端。

什麼是 HTTP Response?

每次當應用程式收到一個 Request,最後都會產生一個 Response。
一句話,我的理解是 HTTP Response 就是跟使用者之間的對話,回應他們 Request 的方式。


為什麼要了解 HTTP Response?

我覺得理解 HTTP Response 可以幫助我們有效控制應用的行為,像是:

  • 提升用戶體驗:正確的回應能確保用戶快速獲得所需信息。
  • 進行錯誤處理:能更好地捕捉和回應用戶的錯誤請求。
  • 改善性能:通過優化回應內容,減少資源消耗和延遲。

HTTP Response 的功能有什麼?

Creating Responses

當我們用 Laravel 開發網站,使用者點擊某個網址或執行某個功能時,系統需要把一個回應發回給瀏覽器。這樣使用者才能看到想要的內容或界面。這裡會返回字串、數組或 Eloquent 模型,Laravel 會自動轉換為相應的回應格式。

  • 基本回應:從路由或控制器返回字串,Laravel會自動轉換為HTTP回應。

    Route::get('/', function () {
        return 'Hello World';
    });
    
  • 返回數組:數組將自動轉換為JSON格式。

    Route::get('/', function () {
        return [1, 2, 3];
    });
    
  • 返回Eloquent模型:自動轉換為JSON格式。

    Route::get('/user/{user}', function (User $user) {
        return $user;
    });
    
  • 傳回狀態碼:返回完整的 Response 實例以自訂 HTTP 狀態碼和標頭。

    return response('Hello World', 200)->header('Content-Type', 'text/plain');
    

Attaching Headers to Responses

大部分的回應方法都是可以連續使用的,這樣可以方便地構建回應。

我們可以使用 headerwithHeaders 方法為回應添加 headers ,用來告訴瀏覽器如何處理 Response。

  • 使用 header 方法可以為回應添加多個 header。

    return response($content)
                ->header('Content-Type', 'text/plain')
                ->header('X-Header-One', 'Header Value');
    
  • 使用 withHeaders 方法可以傳遞一組 header。

    return response($content)->withHeaders([
        'Content-Type' => 'text/plain',
        'X-Header-One' => 'Header Value',
    ]);
    

Attaching Cookies to Responses

將 Cookies 附加到回應是一個重要的功能,能夠幫助使用者的瀏覽器記住關鍵資訊,如登錄狀態和個人偏好。開發者可以使用 cookie 方法將 Cookies 添加到回應中,指定名稱、值和有效時間。若尚未創建回應實例,則可以使用 Cookie facade 的 queue 方法排隊添加 Cookies,確保它們在回應發送時一併附上,方便管理使用者的會話和偏好設置。

  • 使用 cookie 方法可以將 Cookie 附加到回應中,並提供其名稱、值和有效時間(幾分鐘)

    return response('Hello World')->cookie('name', 'value', $minutes);
    
  • 如果需要在沒有回應實例的情況下附加 Cookie,可以使用 Cookie facade 的 queue 方法。這樣,當回應發送時,這些 Cookie 就會自動附加上去。

    use Illuminate\Support\Facades\Cookie;
    
    Cookie::queue('name', 'value', $minutes);
    

Redirects

在 Laravel 中,Redirect 回應是在 Illuminate\Http\RedirectResponse 類別中。使用 redirect 方法 Redirect 到新的 URL、命名路由或控制器操作。

  • 使用 redirect 方法,能夠將使用者導向其他網址。

    return redirect('/home/dashboard');
    
  • 需要將使用者導回之前的頁面(例如表單提交無效時),可以使用 back 方法函數,但這需要確保路由使用 web 中間件

    Route::post('/user/profile', function () {
        return back()->withInput();
    });
    
  • 可以 Redirect 到命名路由或控制器操作。

    // 透過命名路由生成 Redirect ,使用 route 方法傳遞參數
    return redirect()->route('login');
    
    // 需要 Redirect 到控制器操作時,則可以使用 action 方法:
    return redirect()->action([UserController::class, 'index']);
    
  • 使用 back 函數可以將使用者 Redirect 回前一頁,withInput() 方法會將當前請求的輸入資料暫時儲存到會話中,以便在重定向後可以重新填充表單。

    return back()->withInput();
    

Other Response Types

Laravel 提供了一個 response 小幫手,可以用來生成不同類型的回應實例。當不帶參數呼叫 response 小幫手時,它會返回一個 Illuminate\Contracts\Routing\ResponseFactory,可以生成不同類型的回應,如視圖、JSON、文件下載等。

  • 查看回應:使用 view 方法,在需要控制回應的狀態和標頭,同時又要返回視圖時。

    return response()->view('hello', $data);
    
  • JSON 回應:使用 json 方法,可以自動設置 Content-Type headers 為 application/json,並將數組轉換為 JSON。

    return response()->json(['name' => 'Abigail', 'state' => 'CA']);
    
  • 文件下載:使用 download 方法強制瀏覽器下載文件。

    return response()->download($pathToFile, 'filename.txt');
    
  • 串流回應:使用stream方法,允許在伺服器傳送資料的同時,客戶端開始處理資料,可以逐步發送數據,適合大數據的情況。

    Route::get('/stream', function () {
        return response()->stream(function (): void {
            // 產生資料的邏輯
        }, 200, ['X-Accel-Buffering' => 'no']);
    });
    
    
  • 串流 JSON 回應:使用streamJson方法,可以逐步串流 JSON 數據,適合大數據的情況

    use App\Models\User;
    
    return response()->streamJson(['users' => User::cursor()]);
    
  • 串流下載:使用streamDownload方法,可以將字串回應轉換為可下載的回應,無需先將資料儲存為檔案在伺服器上,這樣可以節省磁碟空間和時間。

    use App\Services\GitHub;
    
    return response()->streamDownload(function () {
        // 生成內容的邏輯
    }, 'filename.md');
    

了解這些基本概念能幫助我有效地管理伺服器與使用者之間的溝通,透過正確的回應,能夠更好地處理用戶請求、減少錯誤,並優化應用的性能。Laravel 提供的多樣化回應選項,如字串、JSON、文件下載等,未來還有許多技術等待我去學習,還是要持續在開發的路上不斷進步!


參考資料

  1. w3school.in - Laravel Response
  2. Laravel官方網站 - HTTP Responses

踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!

寶劍騎士:今天抽到這張牌,我還以為我可以寫得很快,結果是在告訴我,時間會過得很快...,明天繼續衝衝!

「想做的事情好多好多卻都沒做,想說還有時間慢慢來,怎麼知道時間一下就過了,才發現自己什麼都沒做就老了。」

-俗女養成記>


上一篇
Day20 - 從請求到回應:探索 Laravel 的 Request Lifecycle
下一篇
Day22 - HTTP Session 跟 Cookie ?
系列文
Laravel 隨筆學習札記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言